{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# PostgreSQL\n",
    "\n",
    "This tutorial will show you how to get a PostgreSQL instance up and running locally to test JupySQL. You can run this in a Jupyter notebook."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Pre-requisites\n",
    "\n",
    "To run this tutorial, you need to install following Python packages:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Note: you may need to restart the kernel to use updated packages.\n"
     ]
    }
   ],
   "source": [
    "%pip install jupysql pandas pyarrow --quiet"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "You also need a PostgreSQL connector. Here's a list of [supported connectors.](https://docs.sqlalchemy.org/en/14/dialects/postgresql.html#dialect-postgresql) We recommend using `psycopg2`. The easiest way to install it is via:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Note: you may need to restart the kernel to use updated packages.\n"
     ]
    }
   ],
   "source": [
    "%pip install psycopg2-binary --quiet"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "```{tip}\n",
    "If you have issues, check out our [installation guide](../howto/postgres-install.md) or [message us on Slack.](https://ploomber.io/community)\n",
    "```\n",
    "\n",
    "You also need Docker installed and running to start the PostgreSQL instance."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Start PostgreSQL instance\n",
    "\n",
    "We fetch the official image, create a new database, and user (this will take 1-2 minutes):"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "94fa1f440c4c8e632b59fc630dd513c4d653c95c964fd4deddf3430db1223c1b\n"
     ]
    }
   ],
   "source": [
    "%%bash\n",
    "docker run --name postgres -e POSTGRES_DB=db \\\n",
    "  -e POSTGRES_USER=user \\\n",
    "  -e POSTGRES_PASSWORD=password \\\n",
    "  -p 5432:5432 -d postgres"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Our database is running, let's load some data!"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Load sample data\n",
    "\n",
    "Now, let's fetch some sample data. We'll be using the [NYC taxi dataset](https://www.nyc.gov/site/tlc/about/tlc-trip-record-data.page):"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(1369769, 19)"
      ]
     },
     "execution_count": 1,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import pandas as pd\n",
    "\n",
    "df = pd.read_parquet(\n",
    "    \"https://d37ci6vzurychx.cloudfront.net/trip-data/yellow_tripdata_2021-01.parquet\"\n",
    ")\n",
    "df.shape"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "As you can see, this chunk of data contains ~1.4M rows, loading the data will take about a minute:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "from sqlalchemy import create_engine\n",
    "\n",
    "engine = create_engine(\"postgresql://user:password@localhost/db\")\n",
    "df.to_sql(name=\"taxi\", con=engine, chunksize=100_000)\n",
    "engine.dispose()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Query\n",
    "\n",
    "Now, let's start JupySQL, authenticate and start querying the data!"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "%load_ext sql"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "%sql postgresql://user:password@localhost/db"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "```{important}\n",
    "If the cell above fails, you might have some missing packages. Message us on [Slack](https://ploomber.io/community) and we'll help you!\n",
    "```"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "List the tables in the database:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<table>\n",
       "    <thead>\n",
       "        <tr>\n",
       "            <th>Name</th>\n",
       "        </tr>\n",
       "    </thead>\n",
       "    <tbody>\n",
       "        <tr>\n",
       "            <td>taxi</td>\n",
       "        </tr>\n",
       "    </tbody>\n",
       "</table>"
      ],
      "text/plain": [
       "+------+\n",
       "| Name |\n",
       "+------+\n",
       "| taxi |\n",
       "+------+"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "%sqlcmd tables"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "List columns in the taxi table:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<table>\n",
       "    <thead>\n",
       "        <tr>\n",
       "            <th>name</th>\n",
       "            <th>type</th>\n",
       "            <th>nullable</th>\n",
       "            <th>default</th>\n",
       "            <th>autoincrement</th>\n",
       "            <th>comment</th>\n",
       "        </tr>\n",
       "    </thead>\n",
       "    <tbody>\n",
       "        <tr>\n",
       "            <td>index</td>\n",
       "            <td>BIGINT</td>\n",
       "            <td>True</td>\n",
       "            <td>None</td>\n",
       "            <td>False</td>\n",
       "            <td>None</td>\n",
       "        </tr>\n",
       "        <tr>\n",
       "            <td>VendorID</td>\n",
       "            <td>BIGINT</td>\n",
       "            <td>True</td>\n",
       "            <td>None</td>\n",
       "            <td>False</td>\n",
       "            <td>None</td>\n",
       "        </tr>\n",
       "        <tr>\n",
       "            <td>tpep_pickup_datetime</td>\n",
       "            <td>TIMESTAMP</td>\n",
       "            <td>True</td>\n",
       "            <td>None</td>\n",
       "            <td>False</td>\n",
       "            <td>None</td>\n",
       "        </tr>\n",
       "        <tr>\n",
       "            <td>tpep_dropoff_datetime</td>\n",
       "            <td>TIMESTAMP</td>\n",
       "            <td>True</td>\n",
       "            <td>None</td>\n",
       "            <td>False</td>\n",
       "            <td>None</td>\n",
       "        </tr>\n",
       "        <tr>\n",
       "            <td>passenger_count</td>\n",
       "            <td>DOUBLE_PRECISION</td>\n",
       "            <td>True</td>\n",
       "            <td>None</td>\n",
       "            <td>False</td>\n",
       "            <td>None</td>\n",
       "        </tr>\n",
       "        <tr>\n",
       "            <td>trip_distance</td>\n",
       "            <td>DOUBLE_PRECISION</td>\n",
       "            <td>True</td>\n",
       "            <td>None</td>\n",
       "            <td>False</td>\n",
       "            <td>None</td>\n",
       "        </tr>\n",
       "        <tr>\n",
       "            <td>RatecodeID</td>\n",
       "            <td>DOUBLE_PRECISION</td>\n",
       "            <td>True</td>\n",
       "            <td>None</td>\n",
       "            <td>False</td>\n",
       "            <td>None</td>\n",
       "        </tr>\n",
       "        <tr>\n",
       "            <td>store_and_fwd_flag</td>\n",
       "            <td>TEXT</td>\n",
       "            <td>True</td>\n",
       "            <td>None</td>\n",
       "            <td>False</td>\n",
       "            <td>None</td>\n",
       "        </tr>\n",
       "        <tr>\n",
       "            <td>PULocationID</td>\n",
       "            <td>BIGINT</td>\n",
       "            <td>True</td>\n",
       "            <td>None</td>\n",
       "            <td>False</td>\n",
       "            <td>None</td>\n",
       "        </tr>\n",
       "        <tr>\n",
       "            <td>DOLocationID</td>\n",
       "            <td>BIGINT</td>\n",
       "            <td>True</td>\n",
       "            <td>None</td>\n",
       "            <td>False</td>\n",
       "            <td>None</td>\n",
       "        </tr>\n",
       "        <tr>\n",
       "            <td>payment_type</td>\n",
       "            <td>BIGINT</td>\n",
       "            <td>True</td>\n",
       "            <td>None</td>\n",
       "            <td>False</td>\n",
       "            <td>None</td>\n",
       "        </tr>\n",
       "        <tr>\n",
       "            <td>fare_amount</td>\n",
       "            <td>DOUBLE_PRECISION</td>\n",
       "            <td>True</td>\n",
       "            <td>None</td>\n",
       "            <td>False</td>\n",
       "            <td>None</td>\n",
       "        </tr>\n",
       "        <tr>\n",
       "            <td>extra</td>\n",
       "            <td>DOUBLE_PRECISION</td>\n",
       "            <td>True</td>\n",
       "            <td>None</td>\n",
       "            <td>False</td>\n",
       "            <td>None</td>\n",
       "        </tr>\n",
       "        <tr>\n",
       "            <td>mta_tax</td>\n",
       "            <td>DOUBLE_PRECISION</td>\n",
       "            <td>True</td>\n",
       "            <td>None</td>\n",
       "            <td>False</td>\n",
       "            <td>None</td>\n",
       "        </tr>\n",
       "        <tr>\n",
       "            <td>tip_amount</td>\n",
       "            <td>DOUBLE_PRECISION</td>\n",
       "            <td>True</td>\n",
       "            <td>None</td>\n",
       "            <td>False</td>\n",
       "            <td>None</td>\n",
       "        </tr>\n",
       "        <tr>\n",
       "            <td>tolls_amount</td>\n",
       "            <td>DOUBLE_PRECISION</td>\n",
       "            <td>True</td>\n",
       "            <td>None</td>\n",
       "            <td>False</td>\n",
       "            <td>None</td>\n",
       "        </tr>\n",
       "        <tr>\n",
       "            <td>improvement_surcharge</td>\n",
       "            <td>DOUBLE_PRECISION</td>\n",
       "            <td>True</td>\n",
       "            <td>None</td>\n",
       "            <td>False</td>\n",
       "            <td>None</td>\n",
       "        </tr>\n",
       "        <tr>\n",
       "            <td>total_amount</td>\n",
       "            <td>DOUBLE_PRECISION</td>\n",
       "            <td>True</td>\n",
       "            <td>None</td>\n",
       "            <td>False</td>\n",
       "            <td>None</td>\n",
       "        </tr>\n",
       "        <tr>\n",
       "            <td>congestion_surcharge</td>\n",
       "            <td>DOUBLE_PRECISION</td>\n",
       "            <td>True</td>\n",
       "            <td>None</td>\n",
       "            <td>False</td>\n",
       "            <td>None</td>\n",
       "        </tr>\n",
       "        <tr>\n",
       "            <td>airport_fee</td>\n",
       "            <td>DOUBLE_PRECISION</td>\n",
       "            <td>True</td>\n",
       "            <td>None</td>\n",
       "            <td>False</td>\n",
       "            <td>None</td>\n",
       "        </tr>\n",
       "    </tbody>\n",
       "</table>"
      ],
      "text/plain": [
       "+-----------------------+------------------+----------+---------+---------------+---------+\n",
       "|          name         |       type       | nullable | default | autoincrement | comment |\n",
       "+-----------------------+------------------+----------+---------+---------------+---------+\n",
       "|         index         |      BIGINT      |   True   |   None  |     False     |   None  |\n",
       "|        VendorID       |      BIGINT      |   True   |   None  |     False     |   None  |\n",
       "|  tpep_pickup_datetime |    TIMESTAMP     |   True   |   None  |     False     |   None  |\n",
       "| tpep_dropoff_datetime |    TIMESTAMP     |   True   |   None  |     False     |   None  |\n",
       "|    passenger_count    | DOUBLE_PRECISION |   True   |   None  |     False     |   None  |\n",
       "|     trip_distance     | DOUBLE_PRECISION |   True   |   None  |     False     |   None  |\n",
       "|       RatecodeID      | DOUBLE_PRECISION |   True   |   None  |     False     |   None  |\n",
       "|   store_and_fwd_flag  |       TEXT       |   True   |   None  |     False     |   None  |\n",
       "|      PULocationID     |      BIGINT      |   True   |   None  |     False     |   None  |\n",
       "|      DOLocationID     |      BIGINT      |   True   |   None  |     False     |   None  |\n",
       "|      payment_type     |      BIGINT      |   True   |   None  |     False     |   None  |\n",
       "|      fare_amount      | DOUBLE_PRECISION |   True   |   None  |     False     |   None  |\n",
       "|         extra         | DOUBLE_PRECISION |   True   |   None  |     False     |   None  |\n",
       "|        mta_tax        | DOUBLE_PRECISION |   True   |   None  |     False     |   None  |\n",
       "|       tip_amount      | DOUBLE_PRECISION |   True   |   None  |     False     |   None  |\n",
       "|      tolls_amount     | DOUBLE_PRECISION |   True   |   None  |     False     |   None  |\n",
       "| improvement_surcharge | DOUBLE_PRECISION |   True   |   None  |     False     |   None  |\n",
       "|      total_amount     | DOUBLE_PRECISION |   True   |   None  |     False     |   None  |\n",
       "|  congestion_surcharge | DOUBLE_PRECISION |   True   |   None  |     False     |   None  |\n",
       "|      airport_fee      | DOUBLE_PRECISION |   True   |   None  |     False     |   None  |\n",
       "+-----------------------+------------------+----------+---------+---------------+---------+"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "%sqlcmd columns --table taxi"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Query our data:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "*  postgresql://user:***@localhost/db\n",
      "1 rows affected.\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<table>\n",
       "    <thead>\n",
       "        <tr>\n",
       "            <th>count</th>\n",
       "        </tr>\n",
       "    </thead>\n",
       "    <tbody>\n",
       "        <tr>\n",
       "            <td>1369769</td>\n",
       "        </tr>\n",
       "    </tbody>\n",
       "</table>"
      ],
      "text/plain": [
       "[(1369769,)]"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "%%sql\n",
    "SELECT COUNT(*) FROM taxi"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Parametrize queries"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "threshold = 10"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "*  postgresql://user:***@localhost/db\n",
      "1 rows affected.\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<table>\n",
       "    <thead>\n",
       "        <tr>\n",
       "            <th>count</th>\n",
       "        </tr>\n",
       "    </thead>\n",
       "    <tbody>\n",
       "        <tr>\n",
       "            <td>1297415</td>\n",
       "        </tr>\n",
       "    </tbody>\n",
       "</table>"
      ],
      "text/plain": [
       "[(1297415,)]"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "%%sql\n",
    "SELECT COUNT(*) FROM taxi\n",
    "WHERE trip_distance < {{threshold}}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "threshold = 0.5"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "*  postgresql://user:***@localhost/db\n",
      "1 rows affected.\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<table>\n",
       "    <thead>\n",
       "        <tr>\n",
       "            <th>count</th>\n",
       "        </tr>\n",
       "    </thead>\n",
       "    <tbody>\n",
       "        <tr>\n",
       "            <td>73849</td>\n",
       "        </tr>\n",
       "    </tbody>\n",
       "</table>"
      ],
      "text/plain": [
       "[(73849,)]"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "%%sql\n",
    "SELECT COUNT(*) FROM taxi\n",
    "WHERE trip_distance < {{threshold}}"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## CTEs"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "*  postgresql://user:***@localhost/db\n",
      "Skipping execution...\n"
     ]
    }
   ],
   "source": [
    "%%sql --save many_passengers --no-execute\n",
    "SELECT *\n",
    "FROM taxi\n",
    "WHERE passenger_count > 3\n",
    "-- remove top 1% outliers for better visualization\n",
    "AND trip_distance < 18.93"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "*  postgresql://user:***@localhost/db\n",
      "1 rows affected.\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<table>\n",
       "    <thead>\n",
       "        <tr>\n",
       "            <th>min</th>\n",
       "            <th>avg</th>\n",
       "            <th>max</th>\n",
       "        </tr>\n",
       "    </thead>\n",
       "    <tbody>\n",
       "        <tr>\n",
       "            <td>0.0</td>\n",
       "            <td>2.5010889812889756</td>\n",
       "            <td>18.92</td>\n",
       "        </tr>\n",
       "    </tbody>\n",
       "</table>"
      ],
      "text/plain": [
       "[(0.0, 2.5010889812889756, 18.92)]"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "%%sql --save trip_stats --with many_passengers\n",
    "SELECT MIN(trip_distance), AVG(trip_distance), MAX(trip_distance)\n",
    "FROM many_passengers"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "This is what JupySQL executes:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "WITH \"many_passengers\" AS (\n",
      "SELECT *\n",
      "FROM taxi\n",
      "WHERE passenger_count > 3\n",
      "-- remove top 1% outliers for better visualization\n",
      "AND trip_distance < 18.93)\n",
      "SELECT MIN(trip_distance), AVG(trip_distance), MAX(trip_distance)\n",
      "FROM many_passengers\n"
     ]
    }
   ],
   "source": [
    "query = %sqlcmd snippets trip_stats\n",
    "print(query)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Plotting"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Axes: title={'center': \"'trip_distance' from 'taxi'\"}, xlabel='trip_distance', ylabel='Count'>"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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aaJff/1VQ4cO1X//+9/yKhcotmt65uZyHnroIX377bdatGiR426Gnj17Ov7XumLFCjVs2FCff/65wsLCFBoaqqFDh+r33393ceVwlYtnGq7UggULnJY/+eQTSXIE7Mtp2rSp6tatq4ULF8oY42g/fPiwEhISSlRLQECAhgwZovvvv1/79u1znFrJv+354nHn/9L/623Rxhh9+OGHJdrvX8XExOjHH3/U2rVrL9mnT58+On78uHJzcxUZGVngdbX/I9K0aVPVq1dPn3zyidPP/MyZM1q8eLHjDqryVJJjJEnvv/9+odsZPny4UlJStGTJEn300Udavny53nrrratQMXBlrumZm6L8/PPPWrhwoX755RcFBQVJkp5++mmtWrVKc+fO1SuvvKIDBw7o8OHD+vTTTzV//nzl5uZq7Nixuueee4r8xxfW1apVKy1atEhxcXFq2LChvL291apVq1Jty8vLS9OmTdPp06d14403KiEhQS+99JJiYmJ06623Fmsbbm5u+uc//6mhQ4fqb3/7mx599FGdPHlSkyZNKtZpqfbt26tPnz5q3bq1atSooeTkZP373/92+gWdP75XX31VMTExcnd3V+vWrdW9e3d5eXnp/vvv17PPPqtz585p1qxZBU7JlMSYMWMUFxenO++8U+PHj9dNN92ks2fPasOGDerTp4+6dOmi++67TwsWLFCvXr00evRo3XTTTfL09NQvv/yidevW6c4779Tf/va3UtdwOW5ubnrttdf04IMPqk+fPho2bJiys7P1+uuv6+TJk5o6depV2/elhIeHS5I++OADVa9eXd7e3goLC1OzZs3UqFEjjR8/XsYY+fv7a8WKFYqPjy+wjdmzZ+s///mP5s6dq5YtW6ply5YaOXKknnvuOd1yyy2cjkfF4tLLmSsQSWbp0qWO5f/93/81koyPj4/Ty8PDw/Tv398YY8yjjz5qJJl9+/Y51ktKSjKSzA8//FDeQ0AFcOjQIRMdHW2qV69uJDnuRsq/I+rTTz8tsM6l7pby8fExO3fuNJ07dzZVqlQx/v7+5vHHHzenT58ucV2zZ882119/vfHy8jJNmjQxc+bMMYMHD77s3VLjx483kZGRpkaNGsZut5uGDRuasWPHmoyMDEef7OxsM3ToUFO7dm1js9mMJHPw4EFjjDErVqwwbdq0Md7e3qZevXrmmWeeMV9++WWB8RZ2N1L+z+HiGk+cOGFGjx5tGjRoYDw9PU2dOnVM7969nf7OnT9/3rzxxhuOfVerVs00a9bMDBs2zOzfv7/EP7+i7pZ6/fXXC11n2bJlpn379sbb29v4+PiYbt26mW+//dapT/6dRb/99luBcfv4+BSrjuKaPn26CQsLM+7u7kaSmTt3rjHGmL1795ru3bub6tWrmxo1aph7773XpKSkOH0Wdu7caapUqWIGDx7stM1z586ZiIgIExoaak6cOOE0JsCVbMb8Zd70Gmaz2bR06VLHd8bExcXpwQcf1J49e+Tu7u7Ut1q1agoMDNTEiRP1yiuvOD2Q7OzZs6patapWr17NXQQotSFDhuizzz7T6dOnXV0KAFQ6nJa6hLZt2yo3N1fp6enq2LFjoX1uueUWXbhwQT///LMaNWokSY7bW/96ASUAACg/13S4OX36tNNdAQcPHtSOHTvk7++vJk2a6MEHH9SgQYM0bdo0tW3bVhkZGVq7dq1atWqlXr166fbbb1e7du308MMPa/r06crLy9OIESPUvXt3NWnSxIUjw7UgLy+vwFcTXMzD45r+Kw7gGnVNn5Zav369unTpUqB98ODBmjdvns6fP6+XXnpJ8+fP19GjR1WzZk1FRUVp8uTJjosojx07pieffFKrV6+Wj4+PYmJiNG3atEr3rcGofIYMGaKPP/64yD7X8F9vANewazrcAJXZoUOHLvtAusjIyHKqBgAqDsINAACwFB7iBwAALOWau9owLy9Px44dU/Xq1Uv0KHwAAOA6xhidOnVKQUFBTl9KW5hrLtwcO3ZMwcHBri4DAACUwpEjRy77BbrXXLjJ/9K8I0eOyNfX18XVAACA4sjKylJwcHCxvvz2mgs3+aeifH19CTcAAFQyxbmkhAuKAQCApRBuAACApRBuAACApbg03GzcuFF9+/ZVUFCQbDabli1bVux1v/32W3l4eOiGG264avUBAIDKx6Xh5syZM2rTpo3efffdEq2XmZmpQYMGqVu3blepMgAAUFm59G6pmJgYxcTElHi9YcOG6YEHHpC7u3uJZnsAAID1VbprbubOnauff/5ZEydOLFb/7OxsZWVlOb0AAIB1Vapws3//fo0fP14LFiyQh0fxJp1iY2Pl5+fnePF0YgAArK3ShJvc3Fw98MADmjx5spo0aVLs9SZMmKDMzEzH68iRI1exSgAA4GqV5gnFp06d0tatW7V9+3aNHDlS0p9fgmmMkYeHh1avXq2uXbsWWM9ut8tut5d3uQAAwEUqTbjx9fXVrl27nNpmzpyptWvX6rPPPlNYWJiLKgMAABWJS8PN6dOn9dNPPzmWDx48qB07dsjf318NGjTQhAkTdPToUc2fP19ubm4KDw93Wr9OnTry9vYu0A4AAK5dLg03W7duVZcuXRzL48aNkyQNHjxY8+bNU2pqqlJSUlxVHgAAqIRsxhjj6iLKU1ZWlvz8/JSZmcm3ggMAUEmU5Pd3pblbCgAAoDgqzQXFlUXo+C9cXQIs4NDU3q4uAQAqLWZuAACApRBuAACApRBuAACApRBuAACApRBuAACApRBuAACApRBuAACApRBuAACApRBuAACApRBuAACApRBuAACApRBuAACApRBuAACApRBuAACApRBuAACApRBuAACApRBuAACApRBuAACApRBuAACApRBuAACApRBuAACApRBuAACApRBuAACApRBuAACApRBuAACApRBuAACApRBuAACApRBuAACApRBuAACApRBuAACApRBuAACApRBuAACApRBuAACApRBuAACApRBuAACApRBuAACApRBuAACApRBuAACApbg03GzcuFF9+/ZVUFCQbDabli1bVmT/JUuWqHv37qpdu7Z8fX0VFRWlr776qnyKBQAAlYJLw82ZM2fUpk0bvfvuu8Xqv3HjRnXv3l0rV65UUlKSunTpor59+2r79u1XuVIAAFBZeLhy5zExMYqJiSl2/+nTpzstv/LKK/rvf/+rFStWqG3btmVcHQAAqIxcGm6uVF5enk6dOiV/f/9L9snOzlZ2drZjOSsrqzxKAwAALlKpLyieNm2azpw5o/79+1+yT2xsrPz8/Byv4ODgcqwQAACUt0obbhYuXKhJkyYpLi5OderUuWS/CRMmKDMz0/E6cuRIOVYJAADKW6U8LRUXF6dHHnlEn376qW6//fYi+9rtdtnt9nKqDAAAuFqlm7lZuHChhgwZok8++US9e/d2dTkAAKCCcenMzenTp/XTTz85lg8ePKgdO3bI399fDRo00IQJE3T06FHNnz9f0p/BZtCgQXr77bd18803Ky0tTZJUpUoV+fn5uWQMAACgYnHpzM3WrVvVtm1bx23c48aNU9u2bfXiiy9KklJTU5WSkuLo//777+vChQsaMWKE6tat63iNHj3aJfUDAICKx6UzN507d5Yx5pLvz5s3z2l5/fr1V7cgAABQ6VW6a24AAACKQrgBAACWQrgBAACWQrgBAACWQrgBAACWQrgBAACWQrgBAACWQrgBAACWQrgBAACWQrgBAACWQrgBAACWQrgBAACWQrgBAACWQrgBAACWQrgBAACWQrgBAACWQrgBAACWQrgBAACWQrgBAACWQrgBAACWQrgBAACWQrgBAACWQrgBAACWQrgBAACWQrgBAACWQrgBAACWQrgBAACWQrgBAACWQrgBAACWQrgBAACWQrgBAACWQrgBAACWQrgBAACWQrgBAACWQrgBAACWQrgBAACWQrgBAACWQrgBAACWQrgBAACWQrgBAACW4tJws3HjRvXt21dBQUGy2WxatmzZZdfZsGGDIiIi5O3trYYNG+q99967+oUCAIBKw6Xh5syZM2rTpo3efffdYvU/ePCgevXqpY4dO2r79u16/vnnNWrUKC1evPgqVwoAACoLD1fuPCYmRjExMcXu/95776lBgwaaPn26JKl58+baunWr3njjDd19991XqUoAAFCZVKprbhITExUdHe3U1qNHD23dulXnz593UVUAAKAicenMTUmlpaUpICDAqS0gIEAXLlxQRkaG6tatW2Cd7OxsZWdnO5azsrKuep0AAMB1KtXMjSTZbDanZWNMoe35YmNj5efn53gFBwdf9RoBAIDrVKpwExgYqLS0NKe29PR0eXh4qGbNmoWuM2HCBGVmZjpeR44cKY9SAQCAi1Sq01JRUVFasWKFU9vq1asVGRkpT0/PQtex2+2y2+3lUR4AAKgAXDpzc/r0ae3YsUM7duyQ9Oet3jt27FBKSoqkP2ddBg0a5Og/fPhwHT58WOPGjVNycrLmzJmjjz76SE8//bQrygcAABWQS2dutm7dqi5dujiWx40bJ0kaPHiw5s2bp9TUVEfQkaSwsDCtXLlSY8eO1YwZMxQUFKR33nmH28ABAICDzeRfkXuNyMrKkp+fnzIzM+Xr61vm2w8d/0WZbxPXnkNTe7u6BACoUEry+7tSXVAMAABwOYQbAABgKYQbAABgKYQbAABgKYQbAABgKYQbAABgKYQbAABgKYQbAABgKYQbAABgKYQbAABgKYQbAABgKYQbAABgKYQbAABgKYQbAABgKYQbAABgKYQbAABgKYQbAABgKYQbAABgKYQbAABgKYQbAABgKYQbAABgKYQbAABgKYQbAABgKYQbAABgKYQbAABgKYQbAABgKYQbAABgKYQbAABgKYQbAABgKYQbAABgKYQbAABgKYQbAABgKYQbAABgKYQbAABgKYQbAABgKYQbAABgKYQbAABgKYQbAABgKYQbAABgKYQbAABgKYQbAABgKS4PNzNnzlRYWJi8vb0VERGhTZs2Fdl/wYIFatOmjapWraq6devqoYce0vHjx8upWgAAUNG5NNzExcVpzJgxeuGFF7R9+3Z17NhRMTExSklJKbT/N998o0GDBumRRx7Rnj179Omnn2rLli0aOnRoOVcOAAAqKpeGmzfffFOPPPKIhg4dqubNm2v69OkKDg7WrFmzCu2/efNmhYaGatSoUQoLC9Ott96qYcOGaevWreVcOQAAqKhcFm5ycnKUlJSk6Ohop/bo6GglJCQUuk6HDh30yy+/aOXKlTLG6Ndff9Vnn32m3r17X3I/2dnZysrKcnoBAADrclm4ycjIUG5urgICApzaAwIClJaWVug6HTp00IIFCzRgwAB5eXkpMDBQ1113nf71r39dcj+xsbHy8/NzvIKDg8t0HAAAoGJx+QXFNpvNadkYU6At3969ezVq1Ci9+OKLSkpK0qpVq3Tw4EENHz78ktufMGGCMjMzHa8jR46Uaf0AAKBi8XDVjmvVqiV3d/cCszTp6ekFZnPyxcbG6pZbbtEzzzwjSWrdurV8fHzUsWNHvfTSS6pbt26Bdex2u+x2e9kPAAAAVEilmrlp2LBhobdfnzx5Ug0bNizWNry8vBQREaH4+Hin9vj4eHXo0KHQdf744w+5uTmX7O7uLunPGR8AAIBShZtDhw4pNze3QHt2draOHj1a7O2MGzdOs2fP1pw5c5ScnKyxY8cqJSXFcZppwoQJGjRokKN/3759tWTJEs2aNUsHDhzQt99+q1GjRummm25SUFBQaYYCAAAspkSnpZYvX+7481dffSU/Pz/Hcm5urtasWaPQ0NBib2/AgAE6fvy4pkyZotTUVIWHh2vlypUKCQmRJKWmpjo982bIkCE6deqU3n33XT311FO67rrr1LVrV7366qslGQYAALAwmynB+Zz8U0I2m63AaSBPT0+FhoZq2rRp6tOnT9lWWYaysrLk5+enzMxM+fr6lvn2Q8d/UebbxLXn0NRLP94AAK5FJfn9XaKZm7y8PElSWFiYtmzZolq1apW+SgAAgKugVHdLHTx4sKzrAAAAKBOlvhV8zZo1WrNmjdLT0x0zOvnmzJlzxYUBAACURqnCzeTJkzVlyhRFRkaqbt26l3zoHgAAQHkrVbh57733NG/ePA0cOLCs6wEAALgipXrOTU5OziUftAcAAOBKpQo3Q4cO1SeffFLWtQAAAFyxUp2WOnfunD744AN9/fXXat26tTw9PZ3ef/PNN8ukOAAAgJIqVbjZuXOnbrjhBknS7t27nd7j4mIAAOBKpQo369atK+s6AAAAykSprrkBAACoqEo1c9OlS5ciTz+tXbu21AUBAABciVKFm/zrbfKdP39eO3bs0O7duzV48OCyqAsAAKBUShVu3nrrrULbJ02apNOnT19RQQAAAFeiTK+5+fvf/873SgEAAJcq03CTmJgob2/vstwkAABAiZTqtNRdd93ltGyMUWpqqrZu3ap//OMfZVIYAABAaZQq3Pj5+Tktu7m5qWnTppoyZYqio6PLpDAAAIDSKFW4mTt3blnXAQAAUCZKFW7yJSUlKTk5WTabTS1atFDbtm3Lqi4AAIBSKVW4SU9P13333af169fruuuukzFGmZmZ6tKlixYtWqTatWuXdZ0AAADFUqq7pZ588kllZWVpz549+v3333XixAnt3r1bWVlZGjVqVFnXCAAAUGylmrlZtWqVvv76azVv3tzR1qJFC82YMYMLigEAgEuVauYmLy9Pnp6eBdo9PT2Vl5d3xUUBAACUVqnCTdeuXTV69GgdO3bM0Xb06FGNHTtW3bp1K7PiAAAASqpU4ebdd9/VqVOnFBoaqkaNGqlx48YKCwvTqVOn9K9//ausawQAACi2Ul1zExwcrG3btik+Pl4//PCDjDFq0aKFbr/99rKuDwAAoERKNHOzdu1atWjRQllZWZKk7t2768knn9SoUaN04403qmXLltq0adNVKRQAAKA4ShRupk+frkcffVS+vr4F3vPz89OwYcP05ptvlllxAAAAJVWicPP999+rZ8+el3w/OjpaSUlJV1wUAABAaZUo3Pz666+F3gKez8PDQ7/99tsVFwUAAFBaJQo39erV065duy75/s6dO1W3bt0rLgoAAKC0ShRuevXqpRdffFHnzp0r8N7Zs2c1ceJE9enTp8yKAwAAKKkS3Qr+P//zP1qyZImaNGmikSNHqmnTprLZbEpOTtaMGTOUm5urF1544WrVCgAAcFklCjcBAQFKSEjQ448/rgkTJsgYI0my2Wzq0aOHZs6cqYCAgKtSKAAAQHGU+CF+ISEhWrlypU6cOKGffvpJxhhdf/31qlGjxtWoDwAAoERK9YRiSapRo4ZuvPHGsqwFAADgipXqu6UAAAAqKsINAACwFMINAACwFJeHm5kzZyosLEze3t6KiIi47BdvZmdn64UXXlBISIjsdrsaNWqkOXPmlFO1AACgoiv1BcVlIS4uTmPGjNHMmTN1yy236P3331dMTIz27t2rBg0aFLpO//799euvv+qjjz5S48aNlZ6ergsXLpRz5QAAoKKymfyH1bhA+/bt1a5dO82aNcvR1rx5c/Xr10+xsbEF+q9atUr33XefDhw4IH9//1LtMysrS35+fsrMzCz0282vVOj4L8p8m7j2HJra29UlAECFUpLf3y47LZWTk6OkpCRFR0c7tUdHRyshIaHQdZYvX67IyEi99tprqlevnpo0aaKnn35aZ8+eveR+srOzlZWV5fQCAADW5bLTUhkZGcrNzS3wROOAgAClpaUVus6BAwf0zTffyNvbW0uXLlVGRoaeeOIJ/f7775e87iY2NlaTJ08u8/oBAEDF5PILim02m9OyMaZAW768vDzZbDYtWLBAN910k3r16qU333xT8+bNu+TszYQJE5SZmel4HTlypMzHAAAAKg6XzdzUqlVL7u7uBWZp0tPTL/n9VHXr1lW9evXk5+fnaGvevLmMMfrll190/fXXF1jHbrfLbreXbfEAAKDCctnMjZeXlyIiIhQfH+/UHh8frw4dOhS6zi233KJjx47p9OnTjrYff/xRbm5uql+//lWtFwAAVA4uPS01btw4zZ49W3PmzFFycrLGjh2rlJQUDR8+XNKfp5QGDRrk6P/AAw+oZs2aeuihh7R3715t3LhRzzzzjB5++GFVqVLFVcMAAAAViEufczNgwAAdP35cU6ZMUWpqqsLDw7Vy5UqFhIRIklJTU5WSkuLoX61aNcXHx+vJJ59UZGSkatasqf79++ull15y1RAAAEAF49Ln3LgCz7lBZcBzbgDAWaV4zg0AAMDVQLgBAACWQrgBAACWQrgBAACWQrgBAACWQrgBAACWQrgBAACWQrgBAACWQrgBAACWQrgBAACWQrgBAACWQrgBAACWQrgBAACWQrgBAACWQrgBAACWQrgBAACWQrgBAACWQrgBAACWQrgBAACWQrgBAACWQrgBAACWQrgBAACWQrgBAACWQrgBAACWQrgBAACWQrgBAACWQrgBAACWQrgBAACWQrgBAACWQrgBAACWQrgBAACWQrgBAACWQrgBAACWQrgBAACWQrgBAACWQrgBAACWQrgBAACWQrgBAACWQrgBAACWQrgBAACWQrgBAACW4vJwM3PmTIWFhcnb21sRERHatGlTsdb79ttv5eHhoRtuuOHqFggAACoVl4abuLg4jRkzRi+88IK2b9+ujh07KiYmRikpKUWul5mZqUGDBqlbt27lVCkAAKgsXBpu3nzzTT3yyCMaOnSomjdvrunTpys4OFizZs0qcr1hw4bpgQceUFRUVDlVCgAAKguXhZucnBwlJSUpOjraqT06OloJCQmXXG/u3Ln6+eefNXHixGLtJzs7W1lZWU4vAABgXS4LNxkZGcrNzVVAQIBTe0BAgNLS0gpdZ//+/Ro/frwWLFggDw+PYu0nNjZWfn5+jldwcPAV1w4AACoul19QbLPZnJaNMQXaJCk3N1cPPPCAJk+erCZNmhR7+xMmTFBmZqbjdeTIkSuuGQAAVFzFm/64CmrVqiV3d/cCszTp6ekFZnMk6dSpU9q6dau2b9+ukSNHSpLy8vJkjJGHh4dWr16trl27FljPbrfLbrdfnUEAAIAKx2UzN15eXoqIiFB8fLxTe3x8vDp06FCgv6+vr3bt2qUdO3Y4XsOHD1fTpk21Y8cOtW/fvrxKBwAAFZjLZm4kady4cRo4cKAiIyMVFRWlDz74QCkpKRo+fLikP08pHT16VPPnz5ebm5vCw8Od1q9Tp468vb0LtAMAgGuXS8PNgAEDdPz4cU2ZMkWpqakKDw/XypUrFRISIklKTU297DNvAAAA/spmjDGuLqI8ZWVlyc/PT5mZmfL19S3z7YeO/6LMt4lrz6GpvV1dAgBUKCX5/e3yu6UAAADKEuEGAABYCuEGAABYCuEGAABYCuEGAABYCuEGAABYCuEGAABYCuEGAABYCuEGAABYCuEGAABYCuEGAABYCuEGAABYCuEGAABYCuEGAABYCuEGAABYCuEGAABYCuEGAABYCuEGAABYCuEGAABYCuEGAABYCuEGAABYCuEGAABYCuEGAABYCuEGAABYCuEGAABYCuEGAABYCuEGAABYCuEGAABYCuEGAABYCuEGAABYCuEGAABYCuEGAABYCuEGAABYCuEGAABYCuEGAABYCuEGAABYCuEGAABYCuEGAABYCuEGAABYCuEGAABYisvDzcyZMxUWFiZvb29FRERo06ZNl+y7ZMkSde/eXbVr15avr6+ioqL01VdflWO1AACgonNpuImLi9OYMWP0wgsvaPv27erYsaNiYmKUkpJSaP+NGzeqe/fuWrlypZKSktSlSxf17dtX27dvL+fKAQBARWUzxhhX7bx9+/Zq166dZs2a5Whr3ry5+vXrp9jY2GJto2XLlhowYIBefPHFYvXPysqSn5+fMjMz5evrW6q6ixI6/osy3yauPYem9nZ1CQBQoZTk97fLZm5ycnKUlJSk6Ohop/bo6GglJCQUaxt5eXk6deqU/P39L9knOztbWVlZTi8AAGBdLgs3GRkZys3NVUBAgFN7QECA0tLSirWNadOm6cyZM+rfv/8l+8TGxsrPz8/xCg4OvqK6AQBAxebyC4ptNpvTsjGmQFthFi5cqEmTJikuLk516tS5ZL8JEyYoMzPT8Tpy5MgV1wwAACouD1ftuFatWnJ3dy8wS5Oenl5gNudicXFxeuSRR/Tpp5/q9ttvL7Kv3W6X3W6/4noBAEDl4LKZGy8vL0VERCg+Pt6pPT4+Xh06dLjkegsXLtSQIUP0ySefqHdvLroEAADOXDZzI0njxo3TwIEDFRkZqaioKH3wwQdKSUnR8OHDJf15Suno0aOaP3++pD+DzaBBg/T222/r5ptvdsz6VKlSRX5+fi4bBwAAqDhcGm4GDBig48ePa8qUKUpNTVV4eLhWrlypkJAQSVJqaqrTM2/ef/99XbhwQSNGjNCIESMc7YMHD9a8efPKu3wAAFABufQ5N67Ac25QGfCcGwBwVimecwMAAHA1EG4AAIClEG4AAIClEG4AAIClEG4AAIClEG4AAIClEG4AAIClEG4AAIClEG4AAIClEG4AAIClEG4AAIClEG4AAIClEG4AAIClEG4AAIClEG4AAIClEG4AAIClEG4AAIClEG4AAIClEG4AAIClEG4AAIClEG4AAIClEG4AAIClEG4AAIClEG4AAIClEG4AAIClEG4AAIClEG4AAIClEG4AAIClEG4AAIClEG4AAIClEG4AAIClEG4AAIClEG4AAIClEG4AAIClEG4AAIClEG4AAIClEG4AAIClEG4AAIClEG4AAIClEG4AAICluDzczJw5U2FhYfL29lZERIQ2bdpUZP8NGzYoIiJC3t7eatiwod57771yqhQAAFQGLg03cXFxGjNmjF544QVt375dHTt2VExMjFJSUgrtf/DgQfXq1UsdO3bU9u3b9fzzz2vUqFFavHhxOVcOAAAqKpsxxrhq5+3bt1e7du00a9YsR1vz5s3Vr18/xcbGFuj/3HPPafny5UpOTna0DR8+XN9//70SExOLtc+srCz5+fkpMzNTvr6+Vz6Ii4SO/6LMt4lrz6GpvV1dAgBUKCX5/e2ymZucnBwlJSUpOjraqT06OloJCQmFrpOYmFigf48ePbR161adP3/+qtUKAAAqDw9X7TgjI0O5ubkKCAhwag8ICFBaWlqh66SlpRXa/8KFC8rIyFDdunULrJOdna3s7GzHcmZmpqQ/E+DVkJf9x1XZLq4tV+vzCQCVVf6/i8U54eSycJPPZrM5LRtjCrRdrn9h7fliY2M1efLkAu3BwcElLRUoN37TXV0BAFRMp06dkp+fX5F9XBZuatWqJXd39wKzNOnp6QVmZ/IFBgYW2t/Dw0M1a9YsdJ0JEyZo3LhxjuW8vDz9/vvvqlmzZpEhqrxlZWUpODhYR44cuSrXAlUUjNNaGKe1XAvjvBbGKFlznMYYnTp1SkFBQZft67Jw4+XlpYiICMXHx+tvf/uboz0+Pl533nlnoetERUVpxYoVTm2rV69WZGSkPD09C13HbrfLbrc7tV133XVXVvxV5Ovra5kPYlEYp7UwTmu5FsZ5LYxRst44Lzdjk8+lt4KPGzdOs2fP1pw5c5ScnKyxY8cqJSVFw4cPl/TnrMugQYMc/YcPH67Dhw9r3LhxSk5O1pw5c/TRRx/p6aefdtUQAABABePSa24GDBig48ePa8qUKUpNTVV4eLhWrlypkJAQSVJqaqrTM2/CwsK0cuVKjR07VjNmzFBQUJDeeecd3X333a4aAgAAqGBcfkHxE088oSeeeKLQ9+bNm1egrVOnTtq2bdtVrqr82e12TZw4scApNKthnNbCOK3lWhjntTBG6doZ56W49CF+AAAAZc3l3y0FAABQlgg3AADAUgg3AADAUgg3AADAUgg3ZSw0NFQ2m83pNX78eKc+KSkp6tu3r3x8fFSrVi2NGjVKOTk5Tn127dqlTp06qUqVKqpXr56mTJlS4Ps0NmzYoIiICHl7e6thw4Z67733CtSzePFitWjRQna7XS1atNDSpUvLftAlMHPmTIWFhcnb21sRERHatGmTS+vJN2nSpALHLTAw0PG+MUaTJk1SUFCQqlSpos6dO2vPnj1O28jOztaTTz6pWrVqycfHR3fccYd++eUXpz4nTpzQwIED5efnJz8/Pw0cOFAnT5506lOcz0dxbdy4UX379lVQUJBsNpuWLVvm9H5FG1dxPvelGeeQIUMKHN+bb765Uo0zNjZWN954o6pXr646deqoX79+2rdvn1MfKxzP4ozTCsdz1qxZat26teMhe1FRUfryyy8d71vhWLqUQZkKCQkxU6ZMMampqY7XqVOnHO9fuHDBhIeHmy5dupht27aZ+Ph4ExQUZEaOHOnok5mZaQICAsx9991ndu3aZRYvXmyqV69u3njjDUefAwcOmKpVq5rRo0ebvXv3mg8//NB4enqazz77zNEnISHBuLu7m1deecUkJyebV155xXh4eJjNmzeXzw/jIosWLTKenp7mww8/NHv37jWjR482Pj4+5vDhwy6p568mTpxoWrZs6XTc0tPTHe9PnTrVVK9e3SxevNjs2rXLDBgwwNStW9dkZWU5+gwfPtzUq1fPxMfHm23btpkuXbqYNm3amAsXLjj69OzZ04SHh5uEhASTkJBgwsPDTZ8+fRzvF+fzURIrV640L7zwglm8eLGRZJYuXer0fkUaV3E+96Ud5+DBg03Pnj2dju/x48ed+lT0cfbo0cPMnTvX7N692+zYscP07t3bNGjQwJw+fdrRxwrHszjjtMLxXL58ufniiy/Mvn37zL59+8zzzz9vPD09ze7duy1zLF2JcFPGQkJCzFtvvXXJ91euXGnc3NzM0aNHHW0LFy40drvdZGZmGmOMmTlzpvHz8zPnzp1z9ImNjTVBQUEmLy/PGGPMs88+a5o1a+a07WHDhpmbb77Zsdy/f3/Ts2dPpz49evQw9913X6nHdyVuuukmM3z4cKe2Zs2amfHjx7uknr+aOHGiadOmTaHv5eXlmcDAQDN16lRH27lz54yfn5957733jDHGnDx50nh6eppFixY5+hw9etS4ubmZVatWGWOM2bt3r5HkFC4TExONJPPDDz8YY4r3+Siti3/pV7RxFedzX5pxGvPnL8M777zzkutUxnGmp6cbSWbDhg3GGOsez4vHaYw1j6cxxtSoUcPMnj3bsseyPHFa6ip49dVXVbNmTd1www16+eWXnab3EhMTFR4e7vTFXz169FB2draSkpIcfTp16uT08KUePXro2LFjOnTokKNPdHS003579OihrVu36vz580X2SUhIKNPxFkdOTo6SkpIK1BMdHe2Segqzf/9+BQUFKSwsTPfdd58OHDggSTp48KDS0tKcarfb7erUqZOj9qSkJJ0/f96pT1BQkMLDwx19EhMT5efnp/bt2zv63HzzzfLz83Pqc7nPR1mpaOMqzuf+Sqxfv1516tRRkyZN9Oijjyo9Pd3xXmUcZ2ZmpiTJ399fknWP58XjzGel45mbm6tFixbpzJkzioqKsuyxLE+EmzI2evRoLVq0SOvWrdPIkSM1ffp0pycwp6WlFfjW8xo1asjLy8vxjeeF9clfvlyfCxcuKCMjo8g+F3+zennIyMhQbm5uhannYu3bt9f8+fP11Vdf6cMPP1RaWpo6dOig48ePO+orqva0tDR5eXmpRo0aRfapU6dOgX3XqVOnyON68eejrFS0cRXnc19aMTExWrBggdauXatp06Zpy5Yt6tq1q7KzsyvlOI0xGjdunG699VaFh4c7rWul41nYOCXrHM9du3apWrVqstvtGj58uJYuXaoWLVpY8liWN5d//UJlMGnSJE2ePLnIPlu2bFFkZKTGjh3raGvdurVq1Kihe+65xzGbI0k2m63A+sYYp/aL+5j/78KtsuhT2P7LS0WrJ19MTIzjz61atVJUVJQaNWqkjz/+2HGhYmlqv9xxLW2fslSRxlWcz3RpDBgwwPHn8PBwRUZGKiQkRF988YXuuuuuS65XUcc5cuRI7dy5U998802B96x0PC81Tqscz6ZNm2rHjh06efKkFi9erMGDB2vDhg1FbreyHsvyxsxNMYwcOVLJyclFvv76v4q/yv/F+NNPP0mSAgMDCyTdEydO6Pz5844kXFif/CnXy/Xx8PBwhKhL9bk4gZeHWrVqyd3dvcLUczk+Pj5q1aqV9u/f77hrqqjaAwMDlZOToxMnThTZ59dffy2wr99++63I43rx56OsVLRxFedzX1bq1q2rkJAQ7d+/37HvyjLOJ598UsuXL9e6detUv359R7vVjuelxlmYyno8vby81Lhx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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "%sqlplot histogram --table taxi --column trip_distance"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Axes: title={'center': \"'trip_distance' from 'taxi'\"}, ylabel='trip_distance'>"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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SlJRUZFcLpe6detW5dGxY0eP918THTt2VOvWrfXPf/7T7TM/evSo5s+fb10pWJvO599Ikt54441qt/PQQw8pLy9PGRkZeuutt/TRRx/ppZdeuggdAxeGESuggYiNjdXcuXP1wQcf6Morr1Tjxo0VGxvr0bb8/Pw0Y8YMHTlyRDfeeKPWrVun5557TgMGDNAtt9xSo214e3vrD3/4g+677z7deeeduv/++3Xo0CFNmjSpRocCu3fvrqSkJHXu3FnNmzfX9u3b9d5777mFg8r398c//lEDBgyQj4+POnfurD59+sjPz0/Dhg3TU089pRMnTui1116rchjsfIwZM0YffPCB7rjjDk2YMEE33XSTjh8/rjVr1igpKUmJiYn6zW9+o/fff1+/+tWv9Pjjj+umm26Sr6+v9u7dq1WrVumOO+7QnXfe6XEP5+Lt7a1p06ZpxIgRSkpK0oMPPqiysjK9+OKLOnTokF544YWLtu8ziYmJkSS9+eabCgwMVOPGjRUVFaWrr75a7du314QJE2SMUVBQkBYtWqTMzMwq2/jb3/6mf/zjH3r77bd17bXX6tprr1VaWpp++9vf6uabb65yfhxQp+r23HkAdsnNzTV9+/Y1gYGBRpJ11V3llX//+te/qrzmTFcFBgQEmC1btphevXoZf39/ExQUZB5++GFz5MiR8+7rb3/7m7nqqquMn5+f6dChg/n73/9uRo4cec6rAidMmGC6detmmjdvbhwOh7nyyivNE088YX788UerpqyszNx3332mVatWxsvLy0gyu3btMsYYs2jRItOlSxfTuHFj07p1a/Pkk0+aTz75pMr7re6qu8rP4fQei4uLzeOPP27atm1rfH19TXBwsBk4cKD55ptvrJqTJ0+a6dOnW/tu2rSpufrqq82DDz5odu7ced6f39muCnzxxRerfc3ChQtN9+7dTePGjU1AQIDp3bu3+fe//+1WU3kF3cGDB6u874CAgBr1UVN/+tOfTFRUlPHx8TGSzNtvv22MMWbbtm2mT58+JjAw0DRv3tzcddddJi8vz+2/hS1bthh/f38zcuRIt22eOHHCdO3a1URGRpri4mK39wTUJS9jfjFeDOCyN2rUKM2bN09Hjhyp61YAoN7hHCsAAACbcI4VgPNWUVFR5XYvp2vUiF8vAC4/HAoEcN5GjRqld95556w1/GoBcDkiWAE4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vfarr77S8ePHrfCxfv16NW3aVG3atDnr66Kjo+Xr66v169db4aO4uFjffvutEhISzvg6f39/DR48WIMHD9ajjz6qq6++Wlu3btUNN9xQ7fvIysrSHXfcof/6r/+S9HMI2rlzp6655poav8fOnTtr7969+vbbb6sdtbrhhhv09ddfKzo6usbbBOA5DgUCuKRFRkZqw4YNys3N1Y8//miN1NREeXm57r33Xm3btk2ffPKJnn32WaWlpcnb++y/+po2bap7771XTz75pFasWKGcnByNGjXqrK+bPXu23nrrLeXk5OiHH37Qe++9J39/f7Vr1856H5999pn27dunH3/8UdLPAS4zM1Pr1q3T9u3b9eCDD6qgoKDG70+SEhISdOutt2rIkCHKzMzUrl279Mknn2jp0qWSpN/+9rfKzs7Wo48+qs2bN2vnzp366KOP9Nhjj53XfgDUDMEKwCVt/Pjx8vHxUadOndSqVasq5x+dTe/evXXVVVfp1ltv1d13361BgwZVmargTF588UXdeuutGjx4sG6//Xbdcsst6tq16xnrr7jiCv31r3/VzTffrM6dO2vFihVatGiRWrRoIUmaMmWKcnNz1b59e2v+q2eeeUY33HCD+vXrp169eik0NFTJyck1fn+V5s+frxtvvFHDhg1Tp06d9NRTT1mjY507d9aaNWu0c+dOxcfH6/rrr9czzzyjsLCw894PgHPzMp6cTAAAl7hRo0bp0KFDWrhwYV23AuAywogVAACATQhWAC47eXl5btMPnP44n8ONAPBLHAoEcNk5deqUcnNzz7g+MjJSjRpx0TSA80ewAgAAsAmHAgEAAGxCsAIAALAJwQoAAMAmBCsAAACbEKwAAABsQrACAACwCcEKAADAJv8fWhP1y4pXsegAAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "%sqlplot boxplot --table taxi --column trip_distance"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Executing Meta-Commands\n",
    "\n",
    "JupySQL supports `psql`-style \\\"backslash\\\" [meta-commands](https://www.postgresql.org/docs/9.6/static/app-psql.html#APP-PSQL-META-COMMANDS) (``\\d``, ``\\dt``, etc.). To run these, [PGSpecial](https://pypi.python.org/pypi/pgspecial) must be installed— information on how to do so can be found [here](../howto/postgres-install.md#installing-pgspecial). Example:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "*  postgresql://user:***@localhost/db\n",
      "1 rows affected.\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<table>\n",
       "    <thead>\n",
       "        <tr>\n",
       "            <th>Schema</th>\n",
       "            <th>Name</th>\n",
       "            <th>Type</th>\n",
       "            <th>Owner</th>\n",
       "        </tr>\n",
       "    </thead>\n",
       "    <tbody>\n",
       "        <tr>\n",
       "            <td>public</td>\n",
       "            <td>taxi</td>\n",
       "            <td>table</td>\n",
       "            <td>user</td>\n",
       "        </tr>\n",
       "    </tbody>\n",
       "</table>"
      ],
      "text/plain": [
       "[('public', 'taxi', 'table', 'user')]"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "%sql \\dt"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Clean up\n",
    "\n",
    "To stop and remove the container:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "CONTAINER ID   IMAGE            COMMAND                  CREATED          STATUS          PORTS                    NAMES\n",
      "4a6478b19d45   mariadb:latest   \"docker-entrypoint.s…\"   21 minutes ago   Up 21 minutes   0.0.0.0:3306->3306/tcp   mariadb\n"
     ]
    }
   ],
   "source": [
    "! docker container ls"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "%%capture out\n",
    "! docker container ls --filter ancestor=postgres --quiet"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Container id: \n"
     ]
    }
   ],
   "source": [
    "container_id = out.stdout.strip()\n",
    "print(f\"Container id: {container_id}\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\"docker container stop\" requires at least 1 argument.\n",
      "See 'docker container stop --help'.\n",
      "\n",
      "Usage:  docker container stop [OPTIONS] CONTAINER [CONTAINER...]\n",
      "\n",
      "Stop one or more running containers\n"
     ]
    }
   ],
   "source": [
    "! docker container stop {container_id}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\"docker container rm\" requires at least 1 argument.\n",
      "See 'docker container rm --help'.\n",
      "\n",
      "Usage:  docker container rm [OPTIONS] CONTAINER [CONTAINER...]\n",
      "\n",
      "Remove one or more containers\n"
     ]
    }
   ],
   "source": [
    "! docker container rm {container_id}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "CONTAINER ID   IMAGE            COMMAND                  CREATED          STATUS          PORTS                    NAMES\n",
      "4a6478b19d45   mariadb:latest   \"docker-entrypoint.s…\"   21 minutes ago   Up 21 minutes   0.0.0.0:3306->3306/tcp   mariadb\n"
     ]
    }
   ],
   "source": [
    "! docker container ls"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.11"
  },
  "myst": {
   "html_meta": {
    "description lang=en": "Query a PostgreSQL database from Jupyter via JupySQL",
    "keywords": "jupyter, sql, jupysql, postgres",
    "property=og:locale": "en_US"
   }
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
